package cn.edu.wynu.apis.collections.app;

import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * 学生信息管理系统主程序
 * 提供用户交互界面，集成所有功能模块
 */
public class StudentManagementSystem {
    private StudentManager studentManager;
    private Scanner scanner;

    /**
     * 构造方法
     */
    public StudentManagementSystem() {
        studentManager = new StudentManager();
        scanner = new Scanner(System.in);
    }

    /**
     * 主程序入口
     */
    public static void main(String[] args) {
        StudentManagementSystem system = new StudentManagementSystem();
        system.run();
    }

    /**
     * 系统主循环
     */
    public void run() {
        System.out.println("🎓 欢迎使用学生信息管理系统！");
        
        while (true) {
            showMenu();
            String choice = scanner.nextLine().trim();
            
            switch (choice) {
                case "1":
                    addStudent();
                    break;
                case "2":
                    deleteStudent();
                    break;
                case "3":
                    updateStudent();
                    break;
                case "4":
                    queryStudent();
                    break;
                case "5":
                    showScoreRanking();
                    break;
                case "6":
                    showClassStatistics();
                    break;
                case "7":
                    showOperationLog();
                    break;
                case "0":
                    System.out.println("👋 感谢使用学生信息管理系统，再见！");
                    return;
                default:
                    System.out.println("❌ 无效选择，请重新输入！");
            }
            
            System.out.println("\n" + "=".repeat(50) + "\n");
        }
    }

    /**
     * 显示主菜单
     */
    private void showMenu() {
        System.out.println("=== 学生信息管理系统 ===");
        System.out.println("1. 添加学生");
        System.out.println("2. 删除学生");
        System.out.println("3. 修改信息");
        System.out.println("4. 查询学生");
        System.out.println("5. 成绩排行榜");
        System.out.println("6. 班级统计");
        System.out.println("7. 操作日志");
        System.out.println("0. 退出系统");
        System.out.print("请输入选择：");
    }

    /**
     * 添加学生功能
     */
    private void addStudent() {
        System.out.println("\n📝 添加学生");
        System.out.println("请输入学生信息（格式：学号 姓名 年龄 班级 成绩）：");
        System.out.print(">> ");
        
        String input = scanner.nextLine().trim();
        String[] parts = input.split("\\s+");
        
        if (parts.length != 5) {
            System.out.println("❌ 输入格式错误！请按格式输入：学号 姓名 年龄 班级 成绩");
            return;
        }
        
        try {
            String id = parts[0];
            String name = parts[1];
            int age = Integer.parseInt(parts[2]);
            String classId = parts[3];
            double score = Double.parseDouble(parts[4]);
            
            Student student = new Student(id, name, age, classId, score);
            
            if (studentManager.addStudent(student)) {
                System.out.println("✅ 添加成功！");
            } else {
                System.out.println("❌ 添加失败！学号可能已存在或信息格式错误。");
            }
        } catch (NumberFormatException e) {
            System.out.println("❌ 年龄或成绩格式错误！请确保输入正确的数字。");
        }
    }

    /**
     * 删除学生功能
     */
    private void deleteStudent() {
        System.out.println("\n🗑️ 删除学生");
        System.out.print("请输入要删除的学号：");
        String id = scanner.nextLine().trim();
        
        if (studentManager.deleteStudent(id)) {
            System.out.println("✅ 删除成功！");
        } else {
            System.out.println("❌ 删除失败！学号不存在。");
        }
    }

    /**
     * 修改学生信息功能
     */
    private void updateStudent() {
        System.out.println("\n✏️ 修改学生信息");
        System.out.print("请输入要修改的学号：");
        String id = scanner.nextLine().trim();
        
        Student oldStudent = studentManager.queryStudentById(id);
        if (oldStudent == null) {
            System.out.println("❌ 学号不存在！");
            return;
        }
        
        System.out.println("当前学生信息：" + oldStudent);
        System.out.println("请输入新的学生信息（格式：姓名 年龄 班级 成绩）：");
        System.out.print(">> ");
        
        String input = scanner.nextLine().trim();
        String[] parts = input.split("\\s+");
        
        if (parts.length != 4) {
            System.out.println("❌ 输入格式错误！请按格式输入：姓名 年龄 班级 成绩");
            return;
        }
        
        try {
            String name = parts[0];
            int age = Integer.parseInt(parts[1]);
            String classId = parts[2];
            double score = Double.parseDouble(parts[3]);
            
            Student newStudent = new Student(id, name, age, classId, score);
            
            if (studentManager.updateStudent(id, newStudent)) {
                System.out.println("✅ 修改成功！");
            } else {
                System.out.println("❌ 修改失败！信息格式错误。");
            }
        } catch (NumberFormatException e) {
            System.out.println("❌ 年龄或成绩格式错误！请确保输入正确的数字。");
        }
    }

    /**
     * 查询学生功能
     */
    private void queryStudent() {
        System.out.println("\n🔍 查询学生");
        System.out.println("1. 按学号查询");
        System.out.println("2. 按姓名查询");
        System.out.print("请选择查询方式：");
        
        String choice = scanner.nextLine().trim();
        
        switch (choice) {
            case "1":
                System.out.print("请输入学号：");
                String id = scanner.nextLine().trim();
                Student student = studentManager.queryStudentById(id);
                if (student != null) {
                    System.out.println("✅ 查询结果：" + student);
                } else {
                    System.out.println("❌ 未找到该学号的学生！");
                }
                break;
                
            case "2":
                System.out.print("请输入姓名（支持模糊查询）：");
                String name = scanner.nextLine().trim();
                List<Student> students = studentManager.queryStudentByName(name);
                if (!students.isEmpty()) {
                    System.out.println("✅ 查询结果（共" + students.size() + "人）：");
                    for (int i = 0; i < students.size(); i++) {
                        System.out.println((i + 1) + ". " + students.get(i));
                    }
                } else {
                    System.out.println("❌ 未找到匹配的学生！");
                }
                break;
                
            default:
                System.out.println("❌ 无效选择！");
        }
    }

    /**
     * 显示成绩排行榜
     */
    private void showScoreRanking() {
        System.out.println("\n🏆 成绩排行榜");
        TreeSet<Student> ranking = studentManager.getScoreRanking();
        
        if (ranking.isEmpty()) {
            System.out.println("📭 暂无学生数据！");
            return;
        }
        
        int rank = 1;
        for (Student student : ranking) {
            System.out.printf("%d. %s\n", rank++, student);
        }
    }

    /**
     * 显示班级统计
     */
    private void showClassStatistics() {
        System.out.println("\n📊 班级统计");
        Map<String, List<Student>> classStats = studentManager.getClassStatistics();
        
        if (classStats.isEmpty()) {
            System.out.println("📭 暂无学生数据！");
            return;
        }
        
        for (Map.Entry<String, List<Student>> entry : classStats.entrySet()) {
            System.out.printf("班级 %s：%d人\n", entry.getKey(), entry.getValue().size());
        }
    }

    /**
     * 显示操作日志
     */
    private void showOperationLog() {
        System.out.println("\n📝 操作日志");
        List<String> logs = studentManager.getOperationLog();
        
        if (logs.isEmpty()) {
            System.out.println("📭 暂无操作记录！");
            return;
        }
        
        for (String log : logs) {
            System.out.println(log);
        }
    }
}